package cfi;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Transaction;
import javax.servlet.ServletException;
import javax.servlet.http.*;

import net.arnx.jsonic.JSON;

import cfi.jdo.CoffeeCustomer;
import cfi.jdo.PMF;
import cfi.jdo.Purchase;
import cfi.jdo.Ticket;
import cfi.util.CfUtil;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

@SuppressWarnings("serial")
public class CfiServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		resp.setContentType("text/plain");
		resp.getWriter().println("Hello, world");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String errorMessage = null;
		String joson = null;
		String idm = req.getParameter("idm");
		if (idm == null || idm == "") {
			errorMessage = "id取得失敗。";
		} else {
			PersistenceManager pm = PMF.get().getPersistenceManager();
			// デタッチ宣言すると。、クローズしてもＯＫらしい。
			pm.setDetachAllOnCommit(true);
			CoffeeCustomer c = null;
			Ticket t = null;
			Purchase p = null;
			List<Purchase> pList = null;
			Transaction tx = null;
			try {
				tx = pm.currentTransaction();
				tx.begin();
				// 顧客ＧＥＴ
				c = pm.getObjectById(CoffeeCustomer.class, idm);
				if (c == null) {
					errorMessage = "登録されていません。";
				} else if (c.getTicketList() == null) {
					errorMessage = "購入済みチケットがありません。購入してください。";
				} else {
					// TODO 残ってる枚数を調べんとあかんよ。。。。。
					if (this.IsTicketsValid(c.getTicketList())) {
						// コーヒーいっぱいＪＤＯ作成
						p = new Purchase(CfUtil.getJPDate(), c);
						pList = c.getPurcaseList();
						if (pList == null) {
							pList = new ArrayList<Purchase>();
						}
						pList.add(p);
						// チケット一枚消化。
						t = this.getValidTicket(c.getTicketList());
						t.setValCountLeft(t.getValCountLeft() - 1);
						pm.makePersistent(c);
						tx.commit();
						joson = JSON.encode(p);
					} else {
						errorMessage = "チケットが1枚もありません。購入してください。";
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
				errorMessage = "登録に失敗。";
			} finally {
				if (tx.isActive()) {
					tx.rollback();
				}
				pm.close();
			}
		}
		if (joson != null) {
			resp.setContentType("application/json; charset=UTF-8");
			resp.getWriter().println(joson);
		} else {
			resp.setContentType("text/plain");
			resp.setContentType("text/html;charset=UTF-8");
			resp.getWriter().println(errorMessage);
		}

	}

	private Ticket getValidTicket(List<Ticket> tList) {
		for (Ticket t : tList) {
			// とりあえず一番にヒットした余ってやつ。
			if (t.getValCountLeft() > 0) {
				return t;
			}
		}
		return null;
	}

	private boolean IsTicketsValid(List<Ticket> tList) {
		// TODO 残ってる枚数を調べんとあかんよ。。。。。
		int validAll = 0;
		for (Ticket t : tList) {
			validAll = validAll + t.getValCountLeft();
		}
		if (validAll == 0) {
			return false;
		}
		return true;
	}
}
